package ArchitectureStyles;

import Utils.*;

import java.util.List;
import java.util.stream.Collectors;

public class EventDriven {
    public static String process(List<String> lines) {
        return EventSystem.handleEvent(lines, EventDriven::handleEvent);
    }

    private static String handleEvent(String line) {
        String[] words = line.split("\\s+", 3);
        if (words.length < 3) {
            return line;
        }
        return swap(words) + (words.length > 3 ? " " + String.join(" ", java.util.Arrays.copyOfRange(words, 3, words.length)) : "");
    }

    private static String swap(String[] words) {
        return words[2] + " " + words[1] + " " + words[0];
    }

    // 模拟的事件系统
    private static class EventSystem {
        public static String handleEvent(List<String> lines, EventHandler handler) {
            return lines.stream()
                    .map(handler::handle)
                    .collect(Collectors.joining("\n"));
        }

        @FunctionalInterface
        private interface EventHandler {
            String handle(String line);
        }
    }
    public static String principle(){
        return """
                事件系统模式基本原理：
                事件：
                事件是系统中发生的重要状态变化或动作的通知。
                它可以是一个对象，包含描述该事件的详细信息，如事件类型、时间戳、触发事件的数据
                松耦合：
                在事件驱动架构中，组件之间通过事件进行通信，彼此解耦，降低了依赖性。
                事件的生产者和消费者之间不需要直接了解对方的具体实现细节，有利于系统的模块化和独立开发、部署。
                异步处理：
                事件的发布和处理是异步进行的，适应高并发场景，并允许消费者按照自己的节奏处理事件，避免阻塞和延迟。
                基于事件的交互：
                系统组件并不直接调用彼此的方法或访问对方的数据，而是通过发送和接收事件消息来进行通信。
                事件总线/消息中间件：
                作为事件传输的通道，负责将事件从生产者可靠地分发给感兴趣的消费者。
                它提供消息路由、过滤、缓冲、持久化等服务，确保事件的异步、解耦传递。""";
    }
}